//
//  NWHomePictureView.swift
//  Weibo01
//
//  Created by 牛威 on 15/12/12.
//  Copyright © 2015年 牛威. All rights reserved.
//

import UIKit
import SDWebImage

private let NWHomePictureViewMargin : CGFloat  = UIScreen.mainScreen().scale * 4
private let NWHomePictureViewCellID  = "NWHomePictureViewCellID"

class NWHomePictureView: UICollectionView {
    
 /// 设置配图的模型属性
    
    var arrayM : HMViewModel? {
    
        didSet {
        
        sizeToFit() //解读 自动计算大小 如果想要更改默认图片的大小 那么就重写sizeThat方法 
                    //过程就是 当你调用sizeToFit的时候,他就会执行sizeThatFits方法,返回一个size给调用方
        
            
            reloadData() //这里的这个刷新很重要 要不然会出现 1个红色cell 6个矩形区域 就是cell的重用 这样每次调用数据源方法都会刷新 ,反之一旦collectionView被重用就不会调用数据源方法 从而不能及时更新item
            
            
        }

    
   }
    
    override func sizeThatFits(size: CGSize) -> CGSize {
        
        
//        return CGSize(width: 200, height: 90 * (random() % 4))
        
        return caclItemSize()
    }
    
    init(){ //这里写这个的原因是方便外界调用
        
      ///MARK: -这里要是写成UICollectionViewLayout会不显示数据一定要切记
        
      let layout = UICollectionViewFlowLayout()
        
        layout.minimumInteritemSpacing = NWHomePictureViewMargin
        layout.minimumLineSpacing = NWHomePictureViewMargin
   
      super.init(frame: CGRectZero, collectionViewLayout: layout)
        
      self.backgroundColor = UIColor(white: 0.9, alpha: 1)
        
        //设置数据源 自己当自己的数据源 
        //应用场景 >自定义视图的小框架
        
        dataSource = self
        
        delegate = self
        
        //注册可重用的cell
        
        
        registerClass(NWHomePictureViewCell.self, forCellWithReuseIdentifier: NWHomePictureViewCellID)
        
        
    
    
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    

}

//MARK: - 实现数据源方法

extension NWHomePictureView : UICollectionViewDataSource,UICollectionViewDelegate{
    
    //实现代理方法
    
    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        
        
        //想要查看数据 那就需要告诉控制器 看个下标 看哪个图片
        //所以你需要传递的是indexPath和url数组过去
        
//        print("\(indexPath),\(arrayM?.thumbnailUrls)")
        
        //通知中心的名字 object发送通知同时传递对象 object userinfo传递多值 字典类型
        
        let info = ["WBLookPhotoIndexPathKEY":indexPath,
            "WBLookPhotoURLsKEY":arrayM!.thumbnailUrls!]
        
        NSNotificationCenter.defaultCenter().postNotificationName(WBLookPhotoNotification, object: self, userInfo: info)
        
    }


    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    
     return arrayM?.thumbnailUrls?.count ?? 0
    
     }
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell{
    
      let cell = collectionView.dequeueReusableCellWithReuseIdentifier(NWHomePictureViewCellID, forIndexPath: indexPath) as! NWHomePictureViewCell
        
        
        cell.imageUrl = arrayM?.thumbnailUrls![indexPath.row]

        return cell
    
    }


}

//MARK: - 照片查看自定义转场动画协议

extension NWHomePictureView : NWPictureAnimatorDelegate {


    func imageViewForPresent(indexPath: NSIndexPath) -> UIImageView {
        
        let iv = UIImageView()
        
        //1设置填充模式
        
        iv.contentMode = .ScaleAspectFill
        iv.clipsToBounds = true
        
        //2设置图片 如果缓存中又图片 就不会去下载,就回去缓存中取
        
//        if let url = arrayM?.thumbnailUrls?[indexPath.item] {
//
//         iv.sd_setImageWithURL(url)
//        }
        
        let key = arrayM?.thumbnailUrls![indexPath.item].absoluteString
        iv.image = SDWebImageManager.sharedManager().imageCache.imageFromDiskCacheForKey(key)
        iv.sizeToFit()

        return iv
    }

    //这里取得的位置是相对于collectionView的,要转为相对于整个屏幕的位置 
    //这里是通过传过来的索引,去转换

    func pictureAnimatorDelegateFrom(indexPath: NSIndexPath) -> CGRect {
        
        
        
        let cell = self.cellForItemAtIndexPath(indexPath)!
        
        //通过cell,可以确定在视图上的准确位置
        //在不同视图切换 "坐标系" self 是cell 的父视图,转换是由父视图完完成的
        //由collectionView将cell的frame,转换为keyWindow的对应的frame位置
        
      let rect =  self.convertRect(cell.frame, toCoordinateSpace: UIApplication.sharedApplication().keyWindow!)

        
        return rect
    }


    func pictureAnimatorDelegateTo(indexPath: NSIndexPath) -> CGRect {
        
        //根据缩略图的大小等比例计算要展示大图的大小
        
        guard let key = arrayM?.thumbnailUrls?[indexPath.item].absoluteString else {
        
           return CGRectZero

        }
        
        guard let image = SDWebImageManager.sharedManager().imageCache.imageFromDiskCacheForKey(key) else {
        
           return CGRectZero
        
        }
        
        let w = UIScreen.mainScreen().bounds.width
        //等比例放缩后的高度
        let h = image.size.height * w / image.size.width
        
        //屏幕高度
        let H = UIScreen.mainScreen().bounds.height
        
        var y : CGFloat = 0
        
        if h < H {
        
         y = (H - h) * 0.5
            
        }
        
        return CGRect(x: 0, y: y, width: w, height: h)
    }
    
}


//MARK: - 计算图片的尺寸

extension NWHomePictureView {


    private func caclItemSize()->CGSize {
        
        let rowCount : CGFloat = 3
        
        let maxWidth = UIScreen.mainScreen().bounds.size.width - 2 * TopViewMargin
        
        let itemWidth = (maxWidth - 2 * CGFloat(NWHomePictureViewMargin)) / rowCount
        
        //设置layout 的itemSize的大小
        
        let layout = collectionViewLayout as! UICollectionViewFlowLayout
        
        layout.itemSize = CGSize(width: itemWidth, height: itemWidth)
      
        
        //MARK: - 判断图片的数量 来计算不同的size
    
    
      let count = arrayM?.thumbnailUrls?.count ?? 0
        
        switch (count) {
        
        case 0:
            
            return CGSizeZero
            
            
        case 1:
            
            var size =  CGSize(width: 150, height: 120)
            
            //获取url 这里都是可选项 所以拿if let 来修改
            
          if  let key = arrayM?.thumbnailUrls?.first?.absoluteString {
            
            //获取图片 这里的key是完整的url http://www.baidu.com
            
            let image =  SDWebImageManager.sharedManager().imageCache.imageFromDiskCacheForKey(key)
            
            //设置尺寸

            size = image.size
            
            }
            
            //过窄处理
            
            size.width =  size.width < 40 ? 40 : size.width
            
            //过宽处理
            
            if size.width > 300 {
            
              let w :CGFloat =  300
                
              let h = size.height * w / size.width
             
              size = CGSizeMake(w, h)
            }
            
            //图片大小
            
            layout.itemSize = size
            
            //返回的视图大小
            
            return size
            
        case 4: // 2 * 2
            
            let w = 2 * itemWidth + NWHomePictureViewMargin
            
            return CGSize(width: w, height: w)
            
        default:
            
            //计算行数
            
            //  2 3
            //  5 6
            //7 8 9
            
            let row = CGFloat((count - 1) / Int(rowCount) + 1)
            
            /// TODO: - 运行在6+上九张图显示错误 让 h和w 各+1就可以了
            
            let h = row * itemWidth + (row - 1) *  NWHomePictureViewMargin
            
            let w = rowCount * itemWidth + (rowCount - 1) *  NWHomePictureViewMargin
            
            return CGSize(width: w, height: h)
        }
        
    }




 }

//MARK: - 配图cell

private class NWHomePictureViewCell : UICollectionViewCell {
    
    
    //设置内容
    
    var imageUrl : NSURL? {
    
        didSet{
        
          iconView.sd_setImageWithURL(imageUrl,
            placeholderImage: nil,  //这里写nil没有报错,原因就是swift在调用oc框架是可选项不严格 oc中没有可选项这个概念
            options:[SDWebImageOptions.RetryFailed, //sd超时时长15s,一旦超时加入黑名单 不再下载,如果把这个属性打开的话,就会把拉入黑名单的属性移除,仍然可以再次下载
            SDWebImageOptions.RefreshCached])    // URL不变,图像边怎么办? url还是那个url,但是图像变了没哟更新,设置完这个属性,它就会去服务器获取最新的图像下载下来,所以在使用sdwebimage 的时候可以尝试着使用这个两个属性
    
            
            //设置gif图标 pathExtension-->扩展名 lowercaseString 小写
            //不是所有的gif都会动
            
            let exc = ((imageUrl?.absoluteString ?? "") as NSString).pathExtension.lowercaseString
            
            gifView.hidden = (exc != "gif")
            
            
        }
        
    }
   
     //添加控件 构造函数设置的frame有多大,就会是多大,不会变 
    
   override init(frame : CGRect) {
    
        super.init(frame : frame)
    
        setupUI()
    
     }
   
   required init?(coder aDecoder: NSCoder) {
       fatalError("init(coder:) has not been implemented")
   }
    
    
    
    //设置界面
    
    private func setupUI(){
    
        //添加控件
        
       contentView.addSubview(iconView)
        
        iconView.addSubview(gifView)
        
        //设置frame 因为cell会变化,这里就把frame固定了显然不符合逻辑,需要使用自动布局把cell填满即可
    
//        iconView.frame = bounds
        
        iconView.snp_makeConstraints { (make) -> Void in
            
            /// top + left + bottom + right ==  edges

            make.edges.equalTo(contentView.snp_edges)
        }
        
        gifView.snp_makeConstraints { (make) -> Void in
            
            make.right.equalTo(iconView.snp_right)
            make.bottom.equalTo(iconView.snp_bottom)
        }
    }
    
   
     //懒加载控件
    
    private lazy var gifView : UIImageView = UIImageView(imageName: "timeline_image_gif")
    
    private lazy var iconView : UIImageView = {
    
         let iv = UIImageView()
        
        //图片被压缩 设置图片的填充模式 这个属性是UIView的
        
        iv.contentMode =  UIViewContentMode.ScaleAspectFill
        
        //剪裁图片
        
        iv.clipsToBounds = true
        
         return iv
        
    }()
}
